package com.tegtech.common.utils.http;

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.util.AntPathMatcher;

import cn.hutool.core.collection.CollectionUtil;

/**
 * URI通配符匹配工具类
 * 
 * @Author Jun
 * @date 2020年5月27日 下午3:40:48
 */
public class RequestUriMatcher {

	/**
	 * URI路径匹配
	 * 匹配规则：
	 *（1）? 匹配一个字符（除过操作系统默认的文件分隔符）
	 *（2）* 匹配0个或多个字符
	 *（3）**匹配0个或多个目录
	 *（4）{spring:[a-z]+} 将正则表达式[a-z]+匹配到的值,赋值给名为 spring 的路径变量.
     *（PS:必须是完全匹配才行,在SpringMVC中只有完全匹配才会进入controller层的方法）
	 * 
	 * @param patternUrl
	 * @param requestUrl
	 * @return
	 */
	public static boolean antMatch(String patternUrl, String requestUrl) {
		if (StringUtils.isEmpty(patternUrl) || StringUtils.isEmpty(requestUrl)) {
			return false;
		}
		AntPathMatcher antPathMatcher = new AntPathMatcher();
		return antPathMatcher.match(patternUrl, requestUrl);
	}
	
	/**
	 * URI路径匹配，多规则匹配
	 * 匹配规则：
	 *（1）? 匹配一个字符（除过操作系统默认的文件分隔符）
	 *（2）* 匹配0个或多个字符
	 *（3）**匹配0个或多个目录
	 *（4）{spring:[a-z]+} 将正则表达式[a-z]+匹配到的值,赋值给名为 spring 的路径变量.
     *（PS:必须是完全匹配才行,在SpringMVC中只有完全匹配才会进入controller层的方法）
	 * 
	 * @param patternUrlList
	 * @param requestUrl
	 * @return	满足任意一个规则即返回true
	 */
	public static boolean antMatchs(List<String> patternUrlList, String requestUrl) {
		if (CollectionUtil.isEmpty(patternUrlList) || StringUtils.isEmpty(requestUrl)) {
			return false;
		}
		AntPathMatcher antPathMatcher = new AntPathMatcher();
		for(String patternUrl : patternUrlList) {
			if(antPathMatcher.match(patternUrl, requestUrl)) {
				return true;
			}
		}
		return false;
	}

}
